package com.kohler.blog.base.exception;

import com.kohler.blog.base.enums.SystemLanguageEnum;
import com.kohler.blog.base.globalConf.Constants;
import com.kohler.blog.utils.StringUtils;
import io.jsonwebtoken.lang.Collections;
import org.springframework.core.io.support.PropertiesLoaderUtils;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.*;

/**
 * 异常信息提示工具类
 */
public class ErrorMessageUtils {

    /**
     * 根据错误提示码， 获取对应错误提示信息（中文）
     *
     * @param errorCode 错误码
     * @return 错误提示信息
     */
    public static String getErrorMessage(String errorCode) {

        return "";
    }

    /**
     * 根据提示码、语言获取对应错误提示信息
     * 注意: language 为空， 按照中文处理
     *
     * @param errorCode 错误码
     * @param language 语言
     * @return 错误提示信息
     */
    public static String getErrorMessage(String errorCode, String language) {

        return "";
    }

    /**
     * 内部类， 用于初始化错误提示信息
     */
    private static final class ErrorMessage {

        private static final Map<String, Map<String, String>> ERROR_MESSAGE_MAP = new HashMap<>();

        static {
            try {
                // 初始化需要使用的编码
                Charset ISO_8859_1 = StandardCharsets.ISO_8859_1;
                Charset UTF_8 = StandardCharsets.UTF_8;

                // 循环系统支持语言
                for (SystemLanguageEnum lang : SystemLanguageEnum.values()) {
                    // 获取对应语言的资源文件路径
                    List<String> resourcePathList = getResourcePath(lang.getCode());

                    // 初始化当前语言对应的提示信息容器
                    Map<String, String> errorMessageMap = new HashMap<>();

                    // 遍历循环资源文件，读取错误提示信息
                    for (String resourcePath : resourcePathList) {
                        Properties properties = PropertiesLoaderUtils.loadAllProperties(resourcePath);
                        properties.forEach((key, value) -> {
                            errorMessageMap.put(new String(((String) key).getBytes(ISO_8859_1), UTF_8), new String(((String) value).getBytes(ISO_8859_1), UTF_8));
                        });
                    }
                    ERROR_MESSAGE_MAP.put(lang.getCode(), errorMessageMap);
                }
            } catch (Exception e) {

            }
        }

        /**
         * 获取内部错误提示信息
         * @param errorCode 错误码
         * @param language 语言
         * @return 错误提示信息
         */
        private static String getErrorMessage(String errorCode, String language) {
            language = StringUtils.isBlank(language) ? SystemLanguageEnum.ZH.getCode() : language;

            Map<String, String> errorMessageMap = ERROR_MESSAGE_MAP.get(language);

            return Collections.isEmpty(errorMessageMap) ? null : errorMessageMap.get(errorCode);
        }

        /**
         * 根据规则获取错误提示资源文件路径
         *
         * @param lang 语言
         * @return 对应语言的资源文件路径
         */
        private static List<String> getResourcePath(String lang) {

            String[] parentPathArr = new String[] {"resource"};
            String[] fileNameArr = new String[] {"error-message"};
            String[] fileNameSuffixArr = new String[] {".properties"};

            List<String> recoursePath = new ArrayList<>();
            for (String path : parentPathArr) {
                for (String fileName: fileNameArr) {
                    for (String suffix : fileNameSuffixArr) {
                        recoursePath.add(path + Constants.PATH_SEPARATOR + fileName + Constants.SYMBOL_HYPHEN + lang + suffix);
                    }
                }
            }

            return recoursePath;
        }
    }
}
